# -*- coding:utf-8 -*-
"""
user表实现增删改查
"""
import logging

import pymongo

from LibrarySystem.config.config import Config
from LibrarySystem.repositories.mongodb.interface.user_data_interface import UserDataInterface
from LibrarySystem.repositories.mongodb.models.user_models import User

module_logger = logging.getLogger("logger")

class UserRepository(UserDataInterface):
    """
    @ClassName：UserRepository
    @Description： 继承用户数据层接口类，本项目只创建一个实例
    负责实现接口功能
    @Author：锦沐Python
    """
    def __init__(self):
        self.config = Config()
        self.connection = None
        self.cursor = None
        # 连接到 MongoDB 服务器
        client = pymongo.MongoClient(host=self.config.MONGODB_CONFIG["host"],
                                     port=self.config.MONGODB_CONFIG["port"])
        # 选择数据库
        db = client.get_database(self.config.MONGODB_CONFIG["database_name"])
        self.users_collection = db.get_collection(self.config.MONGODB_CONFIG["users_collection"])

    def add_user(self, user: User):
        """
         增加用户到数据库
        :param user:
        :return: (操作结果标志, 数据|提示信息)
        """
        user_id = user.user_id
        try:
            # 查询用户
            result = self.users_collection.find_one(filter={"user_id": user_id}, projection={"_id":0})
            if result:
                module_logger.info("users 已存在")
                return (False, f"用户 {user_id} 已存在")

            # 写入数据
            result = self.users_collection.insert_one(user.obj_to_dict())

            if result:
                module_logger.info(f"用户 {user_id} 添加成功")
                return (True, f"用户 {user_id} 添加成功")
            else:
                module_logger.error(f"添加用户失败 {user_id}")
                return (False, f"添加用户失败 {user_id}")

        except Exception as e:
            # 处理其他可能的异常
            module_logger.info(f"添加用户失败：{e}")
            return (False, f"添加用户失败 {user_id}： {e}")


    def update_user(self, user: User):
        """
        根据user_id更新用户信息
        :param user:
        :return: (操作结果标志, 数据|提示信息)
        """
        user_id = user.user_id

        try:
            # 读数据
            result = self.users_collection.find_one(filter={"user_id": user_id}, projection={"_id":0})

            if result is None:
                module_logger.info(f"用户{user_id}不存在，更新失败")
                return (False, f"用户{user_id}不存在，更新失败")

            # 写入数据
            result = self.users_collection.update_one(filter={"user_id": user_id}, update={"$set": user.obj_to_dict()})

            if result.matched_count > 0:
                module_logger.info(f"用户 {user_id} 更新成功")
                return (True, f"用户 {user_id} 更新成功")
            else:
                module_logger.error(f"更新失败 {user_id}")
                return (False, f"更新失败 {user_id}")

        except Exception as e:
            # 处理其他可能的异常
            module_logger.info(f"修改用户信息失败：{e}")
            return (False, f"修改用户信息失败：{e}")

    def query_user(self, user_id: str):
        """
        查询用户
        :param user_id:
        :return: (操作结果标志, 数据|提示信息)
        """
        try:
            result = self.users_collection.find_one(filter={"user_id": user_id}, projection={"_id":0})
            print(result)
            if result is None:
                module_logger.info(f"用户{user_id}不存在")
                return (False, f"用户{user_id}不存在")

            # 创建一个 User 对象 result
            get_user = User(**result)
            return (True, get_user)
        except Exception as e:
            # 处理其他可能的异常
            module_logger.info(f"查询用户信息失败：{e}")
            return (False, f"查询用户信息失败：{e}")

    def del_user(self, user_id: str):
        """
        删除用户信息
        :param user_id:
        :return: (操作结果标志, 数据|提示信息)
        """
        try:
            # 读数据
            result = self.users_collection.find_one(filter={"user_id": user_id}, projection={"_id":0})
            if result is None:
                module_logger.info(f"用户{user_id}不存在，无法删除")
                return (False, f"用户{user_id} 不存在，无法删除")

            # 写入数据
            result = self.users_collection.delete_one(filter={"user_id": user_id})
            if result.deleted_count>0:
                return (True, f"用户{user_id} 已删除")
            else:
                return (False, f"删除用户{user_id} 失败")
        except Exception as e:
            # 处理其他可能的异常
            module_logger.info(f"删除用户信息失败：{e}")
            return (False, f"删除用户信息失败：{e}")
